#include "Framebuffer.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>

#include <math.h>
#include "FractalDragon.h"
#include "Framebuffer.h"
#include "Polyline.h"
#include "Line.h"

#include <time.h>

int main(int argc, char *argv[])
{
	int step = 15;
	if (argc == 2)
	{
		step = atoi(argv[1]);
	}

	CFramebuffer framebuffer;
	framebuffer.Init();

	// 获取屏幕宽度和高度
	int screenWidth = framebuffer.GetWidth();
	int screenHeight = framebuffer.GetHeight();

	// 绘制六边形
	VecPt ptVec;
	// 使用屏幕中心作为六边形的中心
	int center_x = screenWidth / 2;	 // X轴中心
	int center_y = screenHeight / 2; // Y轴中心
	int length = 250;				 // 边长调整到100，以适应屏幕

	// 计算每个顶点，并把每个点push_back到vector
	for (int i = 0; i < 6; ++i)
	{
		int angle = i * 60; // 每个顶点的角度（60度间隔）
		int x = center_x + length * cos(angle * PI / 180);
		int y = center_y + length * sin(angle * PI / 180);
		ptVec.push_back(CPoint(x, y)); // 添加顶点
	}

	// // 闭合多段线
	// CPolyline polyline(ptVec, CColor(0, 255, 0), true);
	// // 绘制
	// framebuffer.DrawPoints(polyline.GetPoints());

	// TODO
	// 绘制分形龙
	// 假设分形龙的宽度和高度大约为100像素
	int dragonWidth = 150;
	int dragonHeight = 150;

	// 计算起始点和结束点，使其位于屏幕中间
	CPoint start((screenWidth - dragonWidth) / 2 + 25, (screenHeight - dragonHeight) / 2);
	CPoint end(start.x + dragonWidth, start.y + dragonHeight);

	// 设置龙的大小
	// CPoint start = CPoint(100, 100);
	// CPoint end = CPoint(200, 200);

	CFractalDragon fractalDragon(start, end, step, CColor(0, 255, 0));
	framebuffer.DrawPoints(fractalDragon.GetPoints());

	// 初始化随机数种子
	srand(time(NULL));
	// while (true)
	// {
	// 	// 生成随机颜色
	// 	int r = 1 + rand() % 255;
	// 	int g = 1 + rand() % 255;
	// 	int b = 1 + rand() % 255;
	// 	CColor randomColor(r, g, b);

	// 	// 设置六边形颜色
	// 	CPolyline polyline(ptVec, randomColor, true);
	// 	framebuffer.DrawPoints(polyline.GetPoints());

	// 	// 设置分形龙的颜色
	// 	fractalDragon.SetColor(randomColor);
	// 	framebuffer.DrawPoints(fractalDragon.GetPoints());

	// 	usleep(500000);

	// 	// sleep(0.5);
	// }

	double rotationAngle = 0; // 旋转角度初始化

	while (true)
	{
		// 清屏
		framebuffer.Init();

		// 生成随机颜色
		int r = 1 + rand() % 255;
		int g = 1 + rand() % 255;
		int b = 1 + rand() % 255;
		CColor randomColor(r, g, b);

		// 计算旋转后的六边形顶点
		VecPt rotatedPtVec;
		for (int i = 0; i < ptVec.size(); ++i)
		{
			double angle = rotationAngle + i * (60 * PI / 180); // 当前旋转角度加上原始角度
			int x = center_x + length * cos(angle);
			int y = center_y + length * sin(angle);
			rotatedPtVec.push_back(CPoint(x, y));
		}

		// 设置六边形颜色并绘制
		CPolyline polyline(rotatedPtVec, randomColor, true);
		framebuffer.DrawPoints(polyline.GetPoints());

		// 设置分形龙的颜色并绘制
		fractalDragon.SetColor(randomColor);
		framebuffer.DrawPoints(fractalDragon.GetPoints());

		// 增加旋转角度
		rotationAngle += 0.05; // 每次增加的旋转角度，可以根据需求调整
		usleep(10000);

		// sleep(0.5);
	}

	return 0;
}
